聚类问题的 5 种评估手段,总有一种你不知道的!附代码实现
全文共 2142 字,阅读全文需 11 分钟
大家好,我是小一
模型评估前面已经介绍了两种,分别对应分类问题:分类问题的 8 种评估方法 和回归问题:回归问题的3个评估深坑。
今天介绍最后一种:聚类模型。“人以类聚,物以群分”,想必大家对于聚类模型都不陌生吧。
举个简单的例子:在中国的乡村有这样一个现象,一个村子的姓氏大多相同,不同村子有不同的姓氏。
那如果现在把王家村、李家村、赵家村的所有人都聚集在一起,前提是不知道他们是哪个村子的,如何对他们进行分类?
特性①:姓名,通过姓氏进行聚类,最终成三类:王+李+赵+其它 特性②:性别,通过性别进行聚类,最终成两类:男+女 特性③:年龄,通过年龄进行聚类,最终成三类:儿童+青年+老年 特性④:价值,通过价值进行聚类,最终成三类:高收入+中收入+低收入 特性⑤:属性,通过属性进行聚类,最终成三类:村领导+村干部+村民 ......
上面的姓氏、性别、年龄、价值和属性等都是村民的内在性质(人物特征),这样的内在性质有很多,也就决定了聚类的标准并不唯一。
在聚类算法中,有这样一个经常问的问题:
问:如何衡量聚类算法的效果?
答:聚类模型的标准不是某种标签输出,根据特征选取的不同聚类的结果也会发生变化,并没有一个永远标准的的答案。
有样本聚类标签的评估
上面我们提到,无法评估聚类效果是因为没有可供参考的真实结果,那如果有呢?
如果有的话,其实完全可以当作分类问题去看待,因为你有样本数据,有样本标签,更适合做分类
如果我偏要用这个数据做聚类呢?怎么评估聚类效果?
当我们 有样本真实聚类情况的数据,我们可以对于聚类算法的结果和真实结果来衡量聚类的效果。一般有以下三种方法:
以下了解即可,不常用
▶1 . 调整兰德指数
调整兰德指数:Adjusted Rand Index 简称 ARI,是兰德系数 RI 的优化,解决了 RI 不能很好的描述随机分配簇类标记向量的相似度问题,而 RI 反映两种划分的重叠程度。
ARI 的取值在 (-1,1) 之间,负值象征着簇内的点差异巨大,正值则表示预测值和真实值差别较小。
即,ARI 越接近 1 越好。
在 sklearn 中,可以通过调用 metrics 模块下的方法计算 ARI,代码如下:
from sklearn.metrics import adjusted_rand_score
# 计算 ARI
adjusted_rand_score([0,0,0,1,1,1], [0,0,1,1,2,2])
# 输出
0.24242424242424246
▶2. 调整互信息分
调整互信息分:Adjusted mutual info score 简称 AMI,是互信息分 MI 的优化,MI 随着分配簇的个数增加而增加。
AMI 是基于预测簇向量与真实簇向量的互信息分数来衡量其相似度的,AMI 越大相似度越高,AMI 接近于0 表示簇向量是随机分配的。
即,AMI 越接近 1 越好。
同样,在 sklearn 中,可以通过调用 metrics 模块下的方法计算,代码如下:
from sklearn.metrics import adjusted_mutual_info_score
# 计算 AMI
adjusted_mutual_info_score([0,0,0,1,1,1], [0,0,1,1,2,2])
# 输出
0.29879245817089006
▶3. 同质性、完整性和 V-measure
同质性和完整性是 基于条件熵 的互信息分数来衡量簇向量间的相似度,V-meansure 是同质性和完整性的调和平均。
同质性:homogeneity,指的是每个簇只包含单个类成员。其实也可以认为就是正确率,表示每个聚类簇中正确分类的样本数占该聚类簇总样本数的比例和;
完整性:completeness,给定类的所有成员分配给同一类簇,也就是每个聚类簇中正确分类的样本数占类型的总样本数比例的和。
V-measure 是结合同质性和完整性两个因素来评价簇向量间的相似度,V-measure 越接近 1 越好。
同样的,给代码:
from sklearn.metrics import homogeneity_score
# 计算 V-measure
homogeneity_score([0,0,0,1,1,1], [0,0,1,1,2,2])
# 输出
0.6666666666666669
无样本聚类标签的评估
上面说的三种评估方法对应的都是真实标签已知的情况,实际项目中需要聚类的样本数据 99% 都是没有真实标签的。
那么,对于真实标签未知的情况,应该怎么去评估预测的性能呢?
▶1. 轮廓系数
轮廓系数是最常用的聚类算法的评价指标,它可以通过计算:
样本与其自身所在簇中的其他样本的相似度 a 样本与其他簇中的样本的相似度 b
其中,样本与同一簇中所有其他点之间的平均距离=a,样本与下一个最近的簇中的所有点之间的平均距离=b
通过以下公式计算轮廓系数:
我们知道,聚类的标准是:簇内差异小,簇间差异大。而轮廓系数 s 越接近 1,表示样本与自己所在簇中的样本很相似,并且与其他簇中的样本不相似,即聚类效果越好;负数则表示聚类效果非常差。
需要注意,轮廓系数范围是(-1,1)
在 sklearn 中,通过使用模块 metrics 中的 silhouette_score 来计算轮廓系数,代码如下:
from sklearn.metrics import silhouette_score
# 计算轮廓系数
silhouette_score(X, y_pred)
代码中的 X 表示样本数据,pre_labels 表示聚类之后的预测。最终返回的是一个数据集中,所有样本的轮廓系数的均值。
▶2. CHI
CHI 全称 Calinski-Harabaz Index,译为卡林斯基-哈拉巴斯指数,最终的得分定义为 组间分散度与组内分散度的比值。
CHI 的计算公式如下:
其中 m 为训练集样本数,k为聚簇个数。Bk 为簇间的协方差矩阵,Wk 为簇内的协方差矩阵,tr 为矩阵的迹。
综上,当簇间差异越大,簇内差异越小,即聚类效果越好的时候,轮廓系数越大。
即:轮廓系数越高表示聚类效果越好。
使用代码如下:
from sklearn.metrics import calinski_harabaz_score
# 计算 CHI
calinski_harabaz_score(X, y_pred)
因为计算方式的原因,CHI 的计算比轮廓系数快了一倍多,所以在选择评价标准的时候可以优先选择 CHI。
总结一下
常见的模型评估方法就算是介绍完了,总算松了一口气,赶紧总结一下:
在分类模型中,有直接结果的输出,而且对于结果我们有明确的定义:是or否,所以我们可以使用预测的 准确度、召回率、混淆矩阵、roc 曲线 等指标来进行评估。
在回归模型中,同样也有直接结果的输出,对于预测结果和真实结果的误差可以用 平均均方误差、平均绝对误差、r2 score 等指标进行评估。
在聚类模型中,当有样本真实标签时可通过 兰德系数、互信息分 等指标评估,但大多数情况下聚类样本是没有标签的,此时可以通过 轮廓系数、CHI 等指标进行评估。
另外,分类模型评估比较常见,而且在金融风控领域对于 ROC 使用的比较多,后面抽空再分享一下 ROC 的评估过程。
往期文章
坚持向暮光所走的人,终将成为耀眼的存在!
1 2 3 三连支持下?我们下节见